package com.solution.admin.product.service;

import java.util.List;
import java.util.Map;

import com.solution.admin.product.entity.ProductEntity;
import com.solution.admin.product.entity.ProductPriceEntity;
import com.solution.admin.product.entity.ProductSpecCompositionEntity;
import com.solution.admin.product.entity.ProductSpecRelaEntity;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;

/**
 * 商品信息接口service接口层
 * 
 * @author xu_cc
 * @date 2017-08-29 20:09:14
 */
public interface ProductService {
    
    /**
     * 获取关联商品<br/>
     * @param productId:当前商品ID<br/>
     * @param type:为空（已选择商品列表），不为空（未关联商品列表）<br/>
     * @return List<ProductEntity>    
     * @author xu_cc  
     * @throws Exception exception
     * @Date 创建时间：2017年9月17日 下午3:22:55
     */
    public List<ProductEntity> listProductRela(Long productId, String type, String productCode, String productName, String productCategoryCode);
    
    /**
     * 单表获取商品列表<br>
     * 上架状态、符合品牌或者品类条件的<br>
     * type[brand,category]<br>
     * brandCode<br>
     * childBrandCode<br>
     * category<br>
     * 
     * @param pageParam
     *            分页对象
     * @param product
     *            分页参数
     * @return PageBean 分页参数及数据
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public PageBean listProductForPromotionPage(PageParam pageParam, Map<String, Object> param);

    /**
     * 获取商品选择规格信息
     * 
     * @param productId
     * @return List<ProductSpecRelaEntity>
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年9月16日 下午4:06:38
     */
    public List<ProductSpecRelaEntity> listProductSpecRelaList(Long productId);

    /**
     * 获取所有价格级别数据
     * 
     * @Title: getProductPriceList
     * @Description:(描述)
     * @param productId
     * @return List<ProductPriceEntity>
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年9月3日 下午1:33:04
     */
    public List<ProductPriceEntity> getProductPriceList(Long productId);

    /**
     * 保存商品信息
     * 
     * @param productEntity
     *            商品信息实体
     * @return Long 返回插入商品信息记录ID
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public long saveProduct(ProductEntity productEntity);

    /**
     * 删除商品信息
     * 
     * @param
     * @return int 返回删除记录条数
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public int deleteProductById(long id);

    /**
     * 根据ID查询商品信息
     * 
     * @param id
     *            商品信息id
     * @return ProductEntity 商品信息对象
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public ProductEntity getProductById(Long id);

    /**
     * 更新商品信息-基本信息
     * 
     * @param ProductEntity
     *            商品信息对象
     * @return int 更新是否成功，>1代表更新成功
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public int updateProductBase(ProductEntity productEntity);
    
    /**
     * 更新商品信息
     * 
     * @param ProductEntity
     *            商品信息对象
     * @return int 更新是否成功，>1代表更新成功
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public int updateProduct(ProductEntity productEntity);

    /**
     * 更新商品信息
     * 
     * @param ProductEntity
     *            商品信息对象
     * @return int 更新是否成功，>1代表更新成功
     * @author xu_cc
     * @throws Exception 
     * @date 2017-08-29 20:09:14
     */
    public int updateProductPrice(ProductEntity productEntity) throws Exception;

    /**
     * 分页查询商品信息
     * 
     * @param pageParam
     *            分页参数
     * @param paramMap
     *            查询参数
     * @return PageBean 分页参数和分页数据
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public PageBean listProductPage(PageParam pageParam, Map<String, Object> paramMap);
    
    /**
     * 商品搜索
     * @param pageParam
     * @param param
     * @return
     */
    public PageBean listProductPageForIndex(PageParam pageParam, Map<String, Object> param);
    
    
    /**
     * 根据条件查询商品信息
     * 
     * @param param
     * @return 商品信息列表
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public List<ProductEntity> listProduct(Map<String, Object> param);

    /**
     * 保存规格信息
     * 
     * @param productId
     * @param productSpecRelaList
     * @param productSpecCompositionList
     * @return int
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年9月16日 下午3:03:30
     */
    public int saveProductSpecComposition(Long productId, List<ProductSpecRelaEntity> productSpecRelaList,
            List<ProductSpecCompositionEntity> productSpecCompositionList);

    /**
     * 更新商品价格（用于导入）
     * 
     * @param product
     * @param proPriceList
     * @return int
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年9月27日 上午12:48:37
     */
    public int updateProductPrice(List<Map<String, ProductEntity>> modMapList);

    /**
     * 为首页配置楼层查询商品信息
     * @param param
     * @return
     * @author llp
     * @date 2017-08-29 20:09:14
     */
	public List<ProductEntity> listProductForIndex(Map<String, Object> param);

	
	/**
	 * 查询商品规格项及对应价格
	 * @param param
	 * @return
	 */
	public List<ProductSpecRelaEntity> listProductSpecPriceByProductId(Map<String, Object> param);
	
	/**
	 * 查询商品规格项组合
	 * @param param
	 * @return
	 */
	public List<ProductSpecCompositionEntity> listProductSpecCompostionByProductId(Map<String, Object> param);

	/**
	 * 查询首页楼层商品的价格
	 * @param param
	 * @return
	 */
	public List<ProductEntity> listFoorProductPrice(Map<String, Object> param);

	/**
	 * 查询商品单位 、类型名称 ，用于展示页面合同商品清单 
	 * @param params
	 * @return
	 */
	public List<ProductEntity> listProductForContract(Map<String, Object> params);
	
	/**
	 * 通过存储过程复制商品
	 * @param productId
	 * @param productCode
	 * @return
	 * @author xkl
	 * @date 2017年12月20日 下午3:05:19
	 */
	public Long copyProduct(Long productId, String productCode);

	/**
	 * 查询商品列表后，再次查询商品默认规格下的价格
	 * @param productList
	 * @author lilp
	 */
	public void initProductDefaultSpecPrice(List<ProductEntity> productList);

	/**
	 * 查询推荐商品
	 * @param productId
	 * @return
	 */
	public List<ProductEntity> listProductRelaList(Map<String, Object> params);
	
	/**
	 * 查询模块配置的商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年1月13日 下午4:26:17
	 */
	public List<ProductEntity> listProductForSiteItem(Map<String, Object> param);
	
	
	/**
	 * 查询pc端首页楼层的商品列表
	 * 过滤下架、删除的商品
	 * @param param
	 * @return
	 * @author lilp
	 * @date 2018年1月13日 下午4:26:17
	 */
	public List<ProductEntity> listIndexFloorProduct(Map<String, Object> param);
	
	/**
	 * 查询用户收藏商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年1月23日 下午7:03:55
	 */
	public List<ProductEntity> listUserFavoriteProduct(Map<String, Object> param);
	
	/**
	 * 根据商品编码获取商品
	 * @param productCode
	 * @return
	 * @author xkl
	 * @date 2018年1月26日 上午10:38:02
	 */
	public ProductEntity getProductByCode(String productCode);
	
	/**
	 * 查询用户浏览记录商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年2月1日 下午8:13:04
	 */
	public List<ProductEntity> listProductBrowseRecord(Map<String, Object> param);

	/**
	 * 计算出整个订单商品的默认普通运费多少 ，快递物流运费多少，其它运费多少
	 * @param shoppingcartIds
	 * @return
	 */
	public ProductEntity listShoppingcartProductDelivery(Map<String, Object> param);
	
	/**
	 * 根据商品ID和商品ID批量获取商品基价
	 * @param paramMap
	 * @return
	 * @author: solin
	 * @date: 2018年4月23日 下午6:59:42
	 */
	public List<ProductEntity> listProductBasePrice(Map<String, Object> paramMap);

	
	/**
	 * 更新商品排序值
	 * @param product
	 * @return
	 */
	public int updateProductSortNo(ProductEntity product);
	
	/**
	 * 根据id集合获取商品列表
	 * @param productList
	 * @return
	 * @author xkl
	 * @date 2018年6月12日 下午6:13:47
	 */
	public Map<Long, ProductEntity> listProductMapByIds(List<String> productList);
}
